// 导入express的请求响应对象
import { Request, Response, NextFunction } from "express";
// 导入"用户"服务中的所有内容（验证用户是否存在用的是用户的服务user.service，中的getUserByName）
import * as userService from '../user/user.service';
// 导入bcrypt包 因为要验证密码
import bcrypt from 'bcrypt';

// 验证用户名是否存在
export const validataLoginData = async (
  req: Request,
  res: Response,
  next: NextFunction
) => {
	const { name, password } = req.body;
	// 验证必填数据 没有用户名交给全局错误处理中间件
	if (!name) return next(new Error("USERNAME_NOT_FOUND"));
	if (!password) return next(new Error("PASSWORD_NOT_FOUND"));

	// 验证用户名
	// 之前只验证用户名，在getUserByName这个方法增加了其他字段的开关之后可以传入第二个参数{isPassword:true} 密码验证字段打开
	const user = await userService.getUserByName(name, { isPassword: true });
	// 没有找到user
	if (!user) return next(new Error("USER_NOT_FOUND"));
	// 在app.middleware修改判断错误类型，异常处理器

	// 验证密码 使用bcrypt解密的方法返回布尔值
	//参数：password接收的密码 ，user就是接收查询的data[0]里面是一个对象这个对象里的password字段，同时也是属性
  const matched = await bcrypt.compare(password, user.password);
  if(!matched) return next(new Error("PASSWORD_ERROR"));
	// 下一步处理
	next();
}